查看原文
其他

为什么要有BIOS?BIOS那些恼人的小问题集锦(一)

wolf uefiblog UEFI社区 2023-12-29
点击上方“公众号” 可以订阅哦!

为啥要有BIOS?

Q:为啥只有X86系统有BIOS?为啥ARM体系就不用BIOS呢?

A:与大多数人基本的概念不同,在某种意义上来说,X86体系比ARM体系更加开放。X86是很多小伙伴一起玩,以生态圈的概念提供产品,并对自己那部分负责;而ARM体系虽然也依赖生态圈,但最终有个大Boss统合整个生态链,提供最后产品并对该产品负总责。

X86生态圈玩家众多,有OS 厂商(OSV)定期发布操作系统,如Windows,Ubuntu;芯片厂商提供CPU,如Intel, AMD;主板厂商(OEM)提供电脑主板;独立硬件供应商(IHV)生产扩展板卡如显卡等等PCIE扩展卡,再如内存厂家推出一代一代不同的内存条等等。

DIY玩家可以自由选择搭配合适/兼容的产品搭配出自己心仪的机器,休闲上网用户花2000多元就可以搭配出一套可用的电脑,而游戏玩家则可能花费上万元才能满足游戏配置需求。还有些品牌机厂商如Dell和联想等,他们提供整套最终产品给用户。但他们实际上是在所有小伙伴的零件基础上拼凑出个产品,技术不强,话语权弱,并不能统一整个产业链。用户津津乐道的反而是用的什么CPU,安装的什么操作系统,用的那种显卡等等。Windows死机、蓝屏和缓慢等等时候,用户往往会抱怨微软和Intel,而不是品牌厂商。

ARM体系由最后品牌厂商统合整个产品,它负责打通整个产业链,并对其中所有部分负责,话语权极强,同时对技术也相对较强。用户面对的具体品牌的产品,而不是碎片化的各个部分。强势的如Apple,硬件软件一起抓,完全组成闭环的链条。稍差也如华为等安卓手机,要负责安卓系统在自己手机移植部分(BSP),客户出了问题并不会找谷歌,而会去找华为。

在X86生态圈十分强势的微软,自己负责操作系统开发,跳过品牌直接服务最终用户,甚至不经允许直接升级操作系统,闹出不少风波。强势也带来了副作用,它要直接面对数千数万种千奇百怪的硬件产品,如何才能用一个软件安装包服务于这么多种设备呢?必须要一个软件抽象层封装这些硬件差别

这就引出了BIOS的最主要的功能:初始化硬件提供硬件的软件抽象

  • ARM体系也要初始化具体主板相关硬件如GPIO和内存等,这些一般在BSP中完成。与X86体系不同之处在于这些硬件完全定制化,初始化的时候就预先知道有哪些设备,Solder Down了哪个品牌的哪种内存颗粒,到时候就照方抓药,初始化一大堆寄存器而已。X86系统配置情况在开机时候是不知道的,需要探测(Probe)、Training(内存和PCIe)和枚举(PCIe等等即插即用设备),相对较复杂。

  • BIOS提供了整个主板、包括主板上外插的设备的软件抽象。通过探测、Training和枚举,BIOS就有了系统所有硬件的信息。它通过几组详细定义好的接口,把这些信息抽象后传递给操作系统,这些信息包括SMBIOS(专栏稍后介绍)、ACPI表(ACPI与UEFI),内存映射表(E820或者UEFI运行时)等等。通过这层映射,才能做到做到操作系统完全不改而能够适配到所有机型和硬件。

在某种程度上来讲,BIOS是将操作系统BSP部分单独封装后下放到主板或者BIOS提供商来完成。这在过去带来了巨大的好处,WinXP、Win7现在还可以运行在更新的电脑硬件上,新的硬件只要自己更改一下就行了,兼容性是ARM体系所不能比拟的。当然割裂的生态圈也带来了用户感受的千差万别,这也受到广泛诟病。各自为政也窒息了创新,带来了同质化。为此,Intel越俎代庖,提出了变形本等等概念;而微软更直接出了Surface,似乎要与过去的小伙伴争食。其实这些都是不得已而为之,今后的发展还需要拭目以待。

进Windows后BIOS还有用吗?

Q:是不是启动进去了操作系统,BIOS就没用了?

A:当然还在起作用。它启动进了操作系统后,大部分内容都释放了,但还留下了不少尾巴:

  • SMM驱动。SMM驱动默默的等待在后台,在合适的情况会触发(trap)运行。有不少主板新奇的功能都靠它。

  • ACPI表和代码(Method)。DSDT和SSDT都有不少代码,这些都会被操作系统频繁调度。

  • UEFI 运行时。根据UEFI Spec,BIOS提供了操作系统运行时需要的一些支持函数,例如读写存贮在BIOS Flash上的variable操作,reset等等。

  • 其他。EC或者BMC等等都在监控系统,它们都有可能触发event,喊来BIOS帮忙。还有些特殊硬件,如显卡还需要和opRegion进行交互。

为啥专栏一会说BIOS一会说UEFI?

Q:BIOS和UEFI是一回事吗?为啥感觉你们在混用?

A:如果将BIOS和UEFI放在一起讲区别,一般BIOS是指传统的那种BIOS,汇编语言写的。UEFI是指它的继任者,绝大多数代码由C语言写成,有开放和标准的UEFI Spec。

但因为现在传统BIOS已经基本被淘汰感觉,一般不做区别说明,BIOS就是指UEFI BIOS。

Q:UEFI怎么念?

A:跟我念:'U','E','F','I'。没有连读的念法。

UEFI是怎么发明出来的?在它之前是啥?

Q:UEFI为什么被发明出来?

A:在UEFI被发明之前,PC机都在用传承自1979年的传统BIOS。初代BIOS由几个IBM工程师开发,他们从没有想到自己写的汇编程序会用这么久。我有幸遇到过其中之一,一个满头银发的慈祥老头,当时他还在IBM工作,他对传统BIOS能工作那么久也深感惊讶,当然还有荣幸。传统BIOS在发明后虽经过修修补补,但本质没有丝毫变化:一堆用汇编写的硬件初始化代码,It works,但它封闭、神秘和充满各种不清不楚的预设和祖传代码。

在1997年,当时的 Intel开始研究如何支持基于安腾处理器芯片组的服务器。这是个全新的系统:处理器,芯片组,操作系统等等,但是初期的计划还是使用传统的BIOS代码来完成此项工作。这样可以至少保证一个东西不变,BIOS。结果任务失败,催生(不得不)了所谓的英特尔引导计划(IBI),目标定位于开发一套支持安腾处理器的引导规范。在排除了购买现成方案后,Intel内部决定开发一套全新的机制。

考虑到底层编程的复杂性以及希望操作系统尽可能少地去了解平台的硬件细节,在平台固件和OS加载器间使用高级C语言接口看起来成为一个必然选择。有了这个绝佳的想法,为启动过程定义一个在固件和操作系统间CPU架构无关的API 只是剩下最后的一跃而已。

在成功支持安腾服务器后,Intel又觉得为什么不把整套方案加入X86体系的支持呢?从此一发不可收拾,在Intel的努力下,新的方案被广泛讨论,并在1999推出1.0 spec,并被定名EFI。后成立Forum,改名UEFI。年表大致如下:

详见:UEFI背后的历史

Q:微软第一个支持UEFI吗?

A:苹果最先推出基于UEFI的电脑。苹果公司往往不是某项技术的发明者,却是该技术用的最早和最好的。它这种勇吃、会吃第一个螃蟹的伟大公司,成为市值第一也是名至实归啊。


继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存